<?php

namespace controller\admin;

defined('IA_ROOT') || exit();

use facade\Model;
use facade\View;
use facade\Util;

// 链接管理
class Link extends Base
{
    // 列表
    public function index()
    {
        if (Util::isAjax()) {
            $param = Util::param();
            $start = ($param['page'] - 1) * $param['limit'];
            $limit = $param['limit'];
            $where = "";
            // 搜索
            if (!empty($param['search'])) {
                foreach ((array)$param['search'] as $k => $v) {
                    if (strlen($v)) {
                        if ($k == 'status') {
                            $where .= " AND `$k` = '$v'";
                        } else if (in_array($k, ['start', 'end'])) {
                            $timestamp = strtotime($v);
                            if ($k == 'start')
                                $where .= " AND `create_at` >= '$timestamp'";
                            else
                                $where .= " AND `create_at` <= '$timestamp'";
                        } else {
                            $where .= " AND `$k` like '%{$v}%'";
                        }
                    }
                }
            }
            $count = Model::fetchColumn("SELECT COUNT(*) FROM `link` WHERE 1=1 $where ORDER BY `id` DESC, `sort` DESC");
            $data = Model::fetchAll("SELECT * FROM `link` WHERE 1=1 $where ORDER BY `id` DESC, `sort` DESC LIMIT $start, $limit");
            if ($count) {
                $res['code'] = 0;
            } else {
                $res['code'] = 1;
                $res['msg'] = '暂无记录';
            }
            $res['count'] = $count;
            $res['data'] = array_map(function ($item) {
                if (preg_match('#(/static/upload/[^\s"\'<>]+?\.[^\s"\'<>]+)#i', $item['logo'], $match)) {
                    $item['logo'] = $this->site_url . $match[1];
                }
                $item['time'] = date('Y-m-d H:i', $item['time']);
                return $item;
            }, $data);
            exit(json_encode($res));
        }
        View::display('admin/link/index.html');
    }

    // 创建
    public function create()
    {
        View::display('admin/link/create.html');
    }

    // 保存
    public function save()
    {
        $param = Util::param(['name', 'url', 'logo', 'sort', 'status']);
        (empty($param['name']) || empty($param['url'])) && Util::errMsg('网站名称或地址为空');

        // 重复验证
        $check1 = Model::fetchColumn("SELECT `name` FROM `link` WHERE `name`=:name ORDER BY `id`", [':name' => $param['name']]);
        $check2 = Model::fetchColumn("SELECT `url` FROM `link` WHERE `url`=:url ORDER BY `id`", [':url' => $param['url']]);
        ($check1 || $check2) && Util::errMsg('网站名称或地址重名');

        false === filter_var($param['url'], FILTER_VALIDATE_URL) && Util::errMsg('网址不合法');

        if (!empty($param['logo'])) {
            !preg_match('/\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff)$/i', $param['logo']) && Util::errMsg('图片格式错误');
            if (preg_match('#(/static/upload/[^\s"\'<>]+?\.[^\s"\'<>]+)#i', $param['logo'], $match)) {
                $param['logo'] = $match[1];
            }
        }

        // 写入数据库记录日志
        $param['time'] = time();
        $lastInsertId = Model::insert('link', $param);
        if ($lastInsertId) {
            // 修改媒体状态
            $paths = [0 => [], 2 => []];
            if (preg_match('#(/static/upload/[^\.]+\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff))#i', $param['logo'], $match)) {
                if (is_file(IA_ROOT . $match[1]))
                    $paths[0][] = $match[1];
                else
                    $paths[2][] = $match[1];
            }
            $paths[0] && Model::update('media', ['status' => 0], ['path' => $paths[0]]);
            $paths[2] && Model::update('media', ['status' => 2], ['path' => $paths[2]]);
            $this->log('创建链接', "创建链接 {$param['name']} 成功", 0);
            Util::errMsg(['code' => 0, 'msg' => '创建链接成功', 'url' => Util::url("/admin/link/index.html")]);
        } else {
            $this->log('创建链接', "创建链接 {$param['name']} 失败", 1);
            Util::errMsg(['code' => 1, 'msg' => '创建链接失败']);
        }
    }

    // 编辑
    public function edit($id = 0)
    {
        $row = Model::fetch("SELECT * FROM `link` WHERE `id`=:id", [':id' => $id]);
        !$row && Util::errMsg('ID错误');
        if (preg_match('#(/static/upload/[^\s"\'<>]+?\.[^\s"\'<>]+)#i', $row['logo'], $match)) {
            $row['logo'] = $this->subdir . $match[1];
        }
        View::assign('row', $row);
        View::display('admin/link/edit.html');
    }

    // 更新
    public function update()
    {
        $param = Util::param(['id', 'name', 'url', 'logo', 'sort', 'status']);
        $row = Model::fetch("SELECT * FROM `link` WHERE `id`=:id", [':id' => $param['id']]);
        !$row && Util::errMsg('ID错误');
        (empty($param['name']) || empty($param['url'])) && Util::errMsg('网站名称或地址为空');

        // 重复验证
        $check1 = Model::fetchColumn("SELECT `name` FROM `link` WHERE `name`=:name ORDER BY `id`", [':name' => $param['name']]);
        $check2 = Model::fetchColumn("SELECT `url` FROM `link` WHERE `url`=:url ORDER BY `id`", [':url' => $param['url']]);
        (($check1 && $check1 !== $row['name']) || ($check2 && $check2 !== $row['url'])) && Util::errMsg('网站名称或地址重名');

        false === filter_var($param['url'], FILTER_VALIDATE_URL) && Util::errMsg('网址不合法');

        if (!empty($param['logo'])) {
            !preg_match('/\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff)$/i', $param['logo']) && Util::errMsg('图片格式错误');
            if (preg_match('#(/static/upload/[^\s"\'<>]+?\.[^\s"\'<>]+)#i', $param['logo'], $match)) {
                $param['logo'] = $match[1];
            }
        }

        // 更新数据库记录日志
        $rowCount = Model::update('link', $param, ['id' => $param['id']]);

        // 修改媒体状态
        $paths = [0 => [], 1 => [], 2 => []];
        if (preg_match('#(/static/upload/[^\.]+\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff))#i', $row['logo'], $match)) {
            if (is_file(IA_ROOT . $match[1]))
                $paths[1][] = $match[1];
            else
                $paths[2][] = $match[1];
        }
        if (preg_match('#(/static/upload/[^\.]+\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff))#i', $param['logo'], $match)) {
            if (is_file(IA_ROOT . $match[1]))
                $paths[0][] = $match[1];
            else
                $paths[2][] = $match[1];
        }
        $paths[1] = array_filter($paths[1], function ($item) use ($paths) {
            return !in_array($item, $paths[0]);
        });
        $paths[1] && Model::update('media', ['status' => 1], ['path' => array_unique($paths[1])]);
        $paths[0] && Model::update('media', ['status' => 0], ['path' => array_unique($paths[0])]);
        $paths[2] && Model::update('media', ['status' => 2], ['path' => array_unique($paths[2])]);
        if ($rowCount) {
            $this->log('编辑链接', "编辑链接 {$row['name']} -> {$param['name']} 成功", 0);
            Util::errMsg(['code' => 0, 'msg' => '编辑链接成功']);
        } else {
            $this->log('编辑链接', "没有改变 {$row['name']} 信息", 0);
            Util::errMsg(['code' => 1, 'msg' => '没有改变信息']);
        }
    }

    // 修改属性
    public function modify()
    {
        $param = Util::param(['id', 'field', 'value']);
        empty($param['id']) && Util::errMsg('ID错误');
        $row = Model::fetch("SELECT * FROM `link` WHERE `id`=:id", [':id' => $param['id']]);
        !$row && Util::errMsg('ID非法');
        (empty($param['field']) || !in_array($param['field'], ['name', 'url', 'sort', 'status'])) && Util::errMsg('非法字段');

        // 验证字段
        if ($param['field'] == 'name') {
            empty($param['value']) && Util::errMsg('链接名不能为空');
            $check = Model::fetchColumn("SELECT `name` FROM `link` WHERE `name`=:name ORDER BY `id`", [':name' => $param['value']]);
            $check && $check !== $row['name'] && Util::errMsg('网站名称重名');
        }
        if ($param['field'] == 'url') {
            false === filter_var($param['value'], FILTER_VALIDATE_URL) && Util::errMsg('网址不合法');
            $check = Model::fetchColumn("SELECT `url` FROM `link` WHERE `url`=:url ORDER BY `id`", [':url' => $param['value']]);
            $check && $check !== $row['url'] && Util::errMsg('网站地址重复');
        }

        // 更新数据库记录日志
        $rowCount = Model::update('link', [$param['field'] => $param['value']], ['id' => $param['id']]);
        if ($rowCount) {
            $this->log('修改属性', "修改属性 {$param['field']}: {$row[$param['field']]} -> {$param['value']} 成功", 0);
            Util::errMsg(['code' => 0, 'msg' => '修改成功']);
        } else {
            $this->log('修改属性', "修改属性 {$param['field']}: {$row[$param['field']]} -> {$param['value']} 失败", 1);
            Util::errMsg(['code' => 1, 'msg' => '修改失败']);
        }
    }

    // 删除
    public function delete()
    {
        $param = Util::param(['id']);
        (empty($param) || !isset($param['id'])) && Util::errMsg('请选择数据');
        $idStr = implode(',', (array)$param['id']);
        $rows = Model::fetchAll("SELECT `name`, `logo` FROM `link` WHERE `id` IN ($idStr)");
        $names = [];
        $paths = [1 => [], 2 => []];
        foreach ($rows as $row) {
            $names[] = $row['name'];
            if (preg_match('#(/static/upload/[^\.]+\.(gif|jpe?g|png|bmp|webp|psd|svg|tiff))#', $row['logo'], $match)) {
                if (is_file(IA_ROOT . $match[1]))
                    $paths[1][] = $match[1];
                else
                    $paths[2][] = $match[1];
            }
        }

        // 删除数据记录日志
        $rowCount = Model::delete('link', ['id' => $param['id']]);
        if ($rowCount) {
            // 修改媒体状态
            $paths[1] && Model::update('media', ['status' => 1], ['path' => array_unique($paths[1])]);
            $paths[2] && Model::update('media', ['status' => 2], ['path' => array_unique($paths[2])]);
            $this->log('删除链接', "删除链接 " . implode(' ', $names) . " 成功", 0);
            Util::errMsg(['code' => 0, 'msg' => '删除成功']);
        } else {
            $this->log('删除链接', "删除链接 " . implode(' ', $names) . " 失败", 1);
            Util::errMsg(['code' => 1, 'msg' => '删除失败']);
        }
    }
}
